作者认为:计算机的所有计算和模拟行为均可以总结成四个字,操作变量,因此,通用的变量抽象极为重要,由于计算机对变量的所有操作均需要经过人工审核(编译),因此,一方面,变量是面向计算机的,需要通过ID(内存地址)用于计算机区分识别,另一方面,变量是面向软件工程师的,作者使用字符串变量为通用变量类保存变量的名称,便于工程师在计算机运行时进行追踪,也方便用户修改XML配置文件中的变量值和变量属性。
作者所有软件工程的基础,通用变量类抽象如下:
class Variant : public State
{
public:
enum
{
TONONE=0,
TOXML=1,
TOFILE=2,
TOBOTH= TOXML|TOFILE,
};
Variant();
Variant(int iID);
Variant(int iID,const QString& sName);
Variant(int iID,const QString& sName, const QVariant& vVar,int iSerialStyle);
bool isVariantValid();
int m_iSerialStyle;
int m_iID;
QString m_sName;
QVariant m_vVar;
bool WriteConfig(QDomDocument &doc, QDomElement &root);
bool ReadConfig(QDomElement &root);
QDomElement AppandRootDom(QDomDocument &doc, QString& name, QDomElement &root);
QDomElement AppandValueDom(QDomDocument &doc, QString &name, QString &value, QDomElement &root);
};
QDataStream &operator<<(QDataStream &out,const Variant& var);
QDataStream &operator>>(QDataStream &in, Variant& var);
作者使用QVariant储存变量值,使用QString变量类型储存变量名称,并额外定义了变量的读写类型以及读写函数,以确定变量是保存在XML配置文件还是参数文件,作者还为变量类提供了ID变量,便于程序索引使用。
类似于数据库的关联表,作者使用变量ID作为外键建立一个变量描述类,用于存储变量元信息,其定义如下:
class VarDesc : public Object
{
public:
VarDesc();
VarDesc(int iID);
VarDesc(int iID,const QStringList& slRange,
const QString &sUnit,double dRate,int iPrecise);
int m_iID;
QStringList m_slRange;
QString m_sUnit;
double m_dRate;
int m_iPrecise;
void WriteConfig(QDomDocument &doc, QDomElement &root);
void ReadConfig(QDomElement &root, int iStartNode);
};
其中:
- m_slRange:使用字符串链表保存变量可能的取值,或者对于数值类型的变量来说,可以用于保存数值的取值范围,第一个数据表示最小值,第二个数据表示最大值。
- m_sUnit:用于保存变量单位。
- m_dRate:用于保存变量缩放比例(这个做备用,一般不在工程中使用)。
- m_iPrecise:变量小数点位数。
类似于数据库中的数据表,作者又使用QMap泛型类建立了一个变量描述表类型(使用变量ID作为Key值),并抽象建立变量描述表类,用于存储项目中所有的变量描述值,并定义为全局变量由整个项目引用。其定义如下:
typedef QMap<int,VarDesc> MVARDESC;
class VarDescTable : public Thing
{
public:
VarDescTable();
MVARDESC m_mVarDesc;
VarDesc* get_VarDesc(int iID);
void add_VarDesc(int iID,const QStringList& slRange=QStringList(),
const QString &sUnit=QString(),double dRate=1,int iPrecise=3);
};
extern VarDescTable m_gVarDescMap;
作者在变量描述表类中额外定义了一些辅助函数,用于快速添加和索引变量描述类。
利用QVariant、QT泛型类提供的拷贝构造函数,以及C++类使用的默认拷贝构造函数,作者在类中和表中均可以直接使用变量类型定义变量,而不用使用变量类型指针定义变量(需要自己管理变量赋值以及变量内存拷贝操作)。
下一篇将介绍项目使用的状态机的计算机模拟定义。
D7FECB19D148C1AD1D829F1CD0E23DB0
发表回复
要发表评论,您必须先登录。